import { orderApi } from "@/api/order";
/**
 * 获取支付参数
 * @param {string} order_id - 订单号
 * @returns {Promise}
 */
const getPayParams = async (order_id) => {
    try {
        const res = await orderApi.getPayParams(order_id);

        if (res.code === 1 && res.data) {
            return res.data;
        } else {
            throw new Error(res.msg || '获取支付参数失败');
        }
    } catch (error) {
        throw new Error('获取支付参数失败：' + error.message);
    }
};


/**
 * 微信支付
 * @param {Object} payParams - 支付参数
 * @returns {Promise}
 */
const wxPay = (payParams) => {
    console.log('原始支付参数：', payParams);

    // 转换参数名称以符合微信支付要求
    const wxPayParams = {
        timeStamp: payParams.timestamp,  // 注意这里是timeStamp，S大写
        nonceStr: payParams.noncestr,    // 注意这里是nonceStr，S大写
        package: payParams.package,
        signType: 'RSA',                 // 添加签名类型
        paySign: payParams.sign,         // 注意这里是paySign
    };

    console.log('转换后的支付参数：', wxPayParams);

    return new Promise((resolve, reject) => {
        uni.requestPayment({
            provider: 'wxpay',
            ...wxPayParams,              // 直接展开参数，不需要包在orderInfo中
            success: (res) => {
                console.log('支付成功', res);
                resolve(res);
            },
            fail: (error) => {
                console.error('支付失败', error);
                const errorMsg = {
                    'requestPayment:fail cancel': '用户取消支付',
                    'requestPayment:fail': '支付失败',
                    'requestPayment:fail network': '网络异常',
                }[error.errMsg] || '支付异常';

                reject(new Error(errorMsg));
            }
        });
    });
};

/**
 * 统一支付处理
 * @param {Object} params - 支付参数
 * @param {string} params.order_id - 订单号
 * @param {string} params.pay_type - 支付方式：wxpay-微信支付
 * @param {Function} params.onSuccess - 支付成功回调
 * @param {Function} params.onFail - 支付失败回调
 * @param {Function} params.onComplete - 支付完成回调（无论成功失败）
 * @returns {Promise}
 */
export const handlePay = async ({ order_id, pay_type = 'wxpay', onSuccess, onFail, onComplete }) => {
    try {

        // 1. 获取支付参数
        const payParams = await getPayParams(order_id);
        console.log(payParams, "payParams");

        // 2. 根据支付方式调用对应的支付函数
        const payMethods = {
            wxpay: () => wxPay(payParams)
        };

        const payMethod = payMethods[pay_type];
        if (!payMethod) {
            throw new Error('不支持的支付方式');
        }

        // 3. 发起支付
        await payMethod();

        // SUCCESS：支付成功
        // REFUND：转入退款
        // NOTPAY：未支付
        // CLOSED：已关闭
        // REVOKED：已撤销（仅付款码支付会返回）
        // USERPAYING：用户支付中（仅付款码支付会返回）
        // PAYERROR：支付失败（仅付款码支付会返回）


        onSuccess && onSuccess();

    } catch (error) {
        if (error.message === '用户取消支付') {
            uni.showToast({ title: '已取消支付', icon: 'none' });
        } else {
            uni.showToast({ title: error.message || '支付失败', icon: 'none' });
        }
        onFail && onFail(error);
        throw error;
    } finally {
        uni.hideLoading();
        onComplete && onComplete();
    }
}; 






//获取支付结果
export const payResult = async (orderId) => {
    const res = await orderApi.getPayStatus(orderId);
    if (res.code === 1 && res.data.trade_state == "SUCCESS") {
        setTimeout(() => {
            uni.removeStorageSync("orderDetail");
            uni.removeStorageSync("step");
            uni.removeStorageSync("params")
            uni.removeStorageSync("selectedAddress");
            uni.setStorageSync("orderId", orderId);
        }, 1000);
        return true;
    }
    return false;
};


//支付
export const pay = (order, callback) => {
    console.log(order, "order");
    handlePay({
        order_id: order.id,
        pay_type: "wxpay"
    }).then(async () => {
        console.log("获取支付结果");
        const isSuccess = await payResult(order.id);
        if (isSuccess) {
            callback && callback();
        } else {
            uni.showToast({ title: res.msg, icon: "none" });
        }
    }).catch((err) => {
        uni.showToast({ title: err.msg, icon: "none" });
    });
};